﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _14_Observer
{
    class Program
    {
        /*
         观察者模式(Publish/Subscribe)：

            将一个系统分割成一系列相互协作的类有一个很不好的副作用，就是需要维护相关对象间的一致性。
            我们不希望为了维持一致性而使各类紧密耦合，这样会给维护、拓展和重用都带来不便。

            当一个对象的改变需要同时改变其他对象的时候，而且它不知道具体有多少对象有待改变时,应考虑使用观察者模式。

            一个抽象模型有两个方面，其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立对象中使他们各
            自独立的改变和复用。

            观察者模式所做的工作其实是解除耦合。让耦合的双方都依赖于抽象，而不是依赖于具体。从而使得各自的变化都
            不会影响另一边的变化。

            但是基于抽象的观察者实现 还是将
             */
        static void Main(string[] args)
        {
            int type = 3;
            if (type == 1)//面向实现的实现
            {
                Secretary secretary = new Secretary();
                StockObserver sb1 = new StockObserver("大屌");
                StockObserver sb2 = new StockObserver("萌妹");

                secretary.Attach(sb1);
                secretary.Attach(sb2);
                secretary.Notify();
            }
            else if (type == 2) //针对抽象的实现
            {
                Boos secretary = new Boos();
                AbstractObserver sb1 = new StockObserverAb("萌妹");
                AbstractObserver sb2 = new StockObserverAb("大屌");

                secretary.Attach(sb1);
                secretary.Attach(sb2);
                secretary.Notify();
            }
            else if (type == 3)
            {
                _14_ObserverDelegate.Boos huhanshan = new _14_ObserverDelegate.Boos();
                _14_ObserverDelegate.NBAbserver tongshi1 = new _14_ObserverDelegate.NBAbserver("大屌", huhanshan);
                _14_ObserverDelegate.StockObserver tongshi2 = new _14_ObserverDelegate.StockObserver("萌妹", huhanshan);

                huhanshan.Update += tongshi1.CloseNBADirectSeeding;
                huhanshan.Update += tongshi2.CloseStockSeeding;

                huhanshan.SubjectState = "我胡汉三回来了!";
                huhanshan.Notify();
            }
            Console.Read();
        }
    }
}
